package com.campus.delivery.service;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.campus.delivery.entity.Notice;
import com.campus.delivery.mapper.NoticeMapper;
import com.campus.delivery.vo.NoticeDetailVo;
import com.campus.delivery.vo.NoticeListVo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 公告表 服务实现类
 * </p>
 *
 * @author ZhaoYuJie
 * @since 2025-07-15
 */
@Service
public class NoticeService extends ServiceImpl<NoticeMapper, Notice> {

    /**
     * 获取配送端公告列表
     * @return 公告列表
     */
    public List<NoticeListVo> getDeliveryNoticeList() {
        LambdaQueryWrapper<Notice> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Notice::getStatus, 1) // 启用状态
                .and(w -> w.eq(Notice::getTargetType, 0).or().eq(Notice::getTargetType, 3)) // 全部端或配送端
                .le(Notice::getStartTime, LocalDateTime.now()) // 开始时间小于等于当前时间
                .ge(Notice::getEndTime, LocalDateTime.now()) // 结束时间大于等于当前时间
                .orderByDesc(Notice::getIsTop) // 置顶优先
                .orderByDesc(Notice::getPriority) // 优先级高的在前
                .orderByDesc(Notice::getCreateTime); // 创建时间倒序
        
        List<Notice> notices = this.list(wrapper);
        return notices.stream().map(notice -> {
            NoticeListVo vo = new NoticeListVo();
            BeanUtil.copyProperties(notice, vo);
            return vo;
        }).collect(Collectors.toList());
    }
    
    /**
     * 获取公告详情并增加查看次数
     * @param id 公告ID
     * @return 公告详情
     */
    public NoticeDetailVo getNoticeDetail(Integer id) {
        Notice notice = this.getById(id);
        if (notice == null) {
            return null;
        }
        
        // 增加查看次数（使用自定义SQL避免并发问题）
        LambdaUpdateWrapper<Notice> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(Notice::getId, id)
                .setSql("view_count = view_count + 1");
        this.update(updateWrapper);
        
        NoticeDetailVo vo = new NoticeDetailVo();
        BeanUtil.copyProperties(notice, vo);
        // 设置更新后的查看次数
        vo.setViewCount(notice.getViewCount() != null ? notice.getViewCount() + 1 : 1);
        return vo;
    }
}
